package ControleAcademico.View;


import java.util.Scanner;

import ControleAcademico.Model.Dao.AlunoImpl;
import ControleAcademico.Model.Dao.AtividadeImpl;
import ControleAcademico.Model.Dao.DisciplinaImpl;
import ControleAcademico.Model.Dao.FaltasImpl;
import ControleAcademico.Model.Dao.HistoricoAtividadeImpl;
import ControleAcademico.Model.Dao.HistoricoDisciplinaImpl;
import ControleAcademico.Model.Dao.ProfessorImpl;
import ControleAcademico.Model.Dao.TurmaImpl;
import ControleAcademico.Model.Pojo.Aluno;
import ControleAcademico.Model.Pojo.Atividade;
import ControleAcademico.Model.Pojo.Disciplina;
import ControleAcademico.Model.Pojo.Faltas;
import ControleAcademico.Model.Pojo.HistoricoAtividade;
import ControleAcademico.Model.Pojo.HistoricoDisciplina;
import ControleAcademico.Model.Pojo.Professor;
import ControleAcademico.Model.Pojo.Turma;

public class Main {

	public static void main(String[] args){
		
		FaltasImpl faltasImpl = new FaltasImpl();
		AtividadeImpl atividadeImpl = new AtividadeImpl();
		HistoricoAtividadeImpl historicoAtividadeImpl = new HistoricoAtividadeImpl();
		DisciplinaImpl disciplinaImpl = new DisciplinaImpl();
		TurmaImpl turmaImpl = new TurmaImpl();
		atividadeImpl.setHistoricoAtividadeImpl(historicoAtividadeImpl);
		atividadeImpl.setTurmaImpl(turmaImpl);
		ProfessorImpl professorImpl = new ProfessorImpl(turmaImpl,disciplinaImpl);
		
		HistoricoDisciplinaImpl historicoDisciplinaImpl = new HistoricoDisciplinaImpl();
		disciplinaImpl.setHistoricoDisciplinaImpl(historicoDisciplinaImpl);
		disciplinaImpl.setProfessorImpl(professorImpl);
		disciplinaImpl.setTurmaImpl(turmaImpl);
		AlunoImpl alunoImpl = new AlunoImpl(historicoAtividadeImpl,historicoDisciplinaImpl,faltasImpl);
		historicoDisciplinaImpl.setAlunoImpl(alunoImpl);
		historicoDisciplinaImpl.setDisciplinaImpl(disciplinaImpl);
		historicoAtividadeImpl.setAlunoImpl(alunoImpl);
		historicoAtividadeImpl.setAtividadeImpl(atividadeImpl);
		faltasImpl.setAlunoImpl(alunoImpl);
		faltasImpl.setTurmaImpl(turmaImpl);
		turmaImpl.setProfessorImpl(professorImpl);
		turmaImpl.setAtividadeImpl(atividadeImpl);
		turmaImpl.setDisciplina(disciplinaImpl);
		turmaImpl.setFaltasImpl(faltasImpl);
		
		
		MenuAluno menuAluno = new MenuAluno (alunoImpl,historicoAtividadeImpl, disciplinaImpl);
		MenuAtividade menuAtividade = new MenuAtividade (atividadeImpl,turmaImpl, historicoAtividadeImpl);
		MenuProfessor menuProfessor = new MenuProfessor (professorImpl,disciplinaImpl);
		MenuDisciplina menuDisciplina = new MenuDisciplina (disciplinaImpl);
		MenuTurma menuTurma = new MenuTurma (turmaImpl, faltasImpl, disciplinaImpl,professorImpl,alunoImpl,historicoAtividadeImpl,historicoDisciplinaImpl);
		
		
		/* -------------Inicio Carregamento dos dados-----------------*/
		/*alunoImpl.carregar();
		historicoDisciplinaImpl.carregar();
		historicoAtividadeImpl.carregar();
		faltasImpl.carregar();
		atividadeImpl.carregar();			//NÃO TROCAR ESSA ORDEM DE FORMA ALGUMA!!!!!!!
		disciplinaImpl.carregar();
		professorImpl.carregar();
		turmaImpl.carregar();*/
		/* -------------Fim Carregamento dos dados-----------------*/
		
		Scanner entrada = new Scanner(System.in);
		boolean sair = false;
		int opcao = 0;
		int opcaoAdmin = 0;
		int opcaoProfessor = 0;
		int opcaoAluno = 0;
		
		while (!sair) {
			
			for(int i=0;i<50;i++){
				System.out.println("");
			}
			System.out.println("Indique quem você é:");
			System.out.println("1 - Administrador");
			System.out.println("2 - Aluno");
			System.out.println("3 - Professor");
			System.out.println("4 - Sair");
			
			String leitura = entrada.nextLine();
			opcao = Integer.parseInt(leitura);
			
			switch (opcao){
			
				case 1:
					boolean admin = true;
					while(admin){
						for(int i=0;i<50;i++){
							System.out.println("");
						}
						
						System.out.println("\n\n:: MENU DO ADMINISTRADOR ::\n");
						System.out.println("1 - Cadastrar Disciplinas");
						System.out.println("2 - Cadastrar Professores");
						System.out.println("3 - Cadastrar Alunos");
						System.out.println("4 - Cadastrar Turma");
						System.out.println("5 - Cadastrar Aluno na Turma");
						System.out.println("6 - Voltar");
						
						leitura = entrada.nextLine();
						opcaoAdmin = Integer.parseInt(leitura);
						
						switch (opcaoAdmin) {
						
							case 1:
								menuDisciplina.cadastrar();
								break;
								
							case 2:
								if(disciplinaImpl.getListaDeDisciplinas().size()!=0){
									menuProfessor.cadastrar();
								}
								else{
									System.out.println("\n\nNão existem disciplinas cadastradas!\n\n");
								}
								break;
								
							case 3:
								
								menuAluno.cadastrar();
								
								break;
								
							case 4:
								
								if((disciplinaImpl.getListaDeDisciplinas().size()!=0) && (professorImpl.getListaDeProfessores().size()!=0)){
									menuTurma.cadastrar();
								}
								else{
									System.out.println("\n\nPara cadastrar turma é necessário haver professor e disciplina já cadastrados no sistema.\n\n");
									try {
									    Thread.sleep(3000);
									} catch(InterruptedException ex) {
									    Thread.currentThread().interrupt();
									}
								}
								break;
					
							case 5:
								if((alunoImpl.getListaDeAlunos().size()==0)&&(turmaImpl.getTurmas().size()==0)){
									
									System.out.println("\n\nÉ necessário existir pelo menos um aluno e uma turma já cadastrados!\n\n");
									
								}else if((alunoImpl.getListaDeAlunos().size()==0)&&(turmaImpl.getTurmas().size()!=0)){
									
									System.out.println("\n\nÉ necessário existir pelo menos um aluno cadastrado!\n\n");
									
								}else if((alunoImpl.getListaDeAlunos().size()!=0)&&(turmaImpl.getTurmas().size()==0)){
									
									System.out.println("\n\nÉ necessário existir pelo menos uma turma cadastrada!\n\n");
								
								}else{
									menuTurma.adicionarAlunoNaTurma();
									break;
								}
								try {
								    Thread.sleep(3000);
								} catch(InterruptedException ex) {
								    Thread.currentThread().interrupt();
								}
								break;
								
							
							case 6:
								
								admin = false;
								break;
								
							default:
								System.out.println("Opção inválida!");
								break;
							
					
						}
					}
					
					break;
				case 2:
					
					boolean alun = true;
					
					while(alun){
					
						for(int i=0;i<50;i++){
							System.out.println("");
						}
						System.out.println("\n\n:: MENU DO ALUNO ::\n");
						System.out.println("1 - Consultar situação do aluno em uma disciplina");
						System.out.println("2 - Voltar");
						
						leitura = entrada.nextLine();
						opcaoAluno = Integer.parseInt(leitura);
						
						switch(opcaoAluno){
							case 1:
								menuAluno.consultarSituacaoAluno();
								break;
							case 2:
								alun = false;
								break;
							default:
								System.out.println("Opção inválida!\n");
								try {
								    Thread.sleep(3000);
								} catch(InterruptedException ex) {
								    Thread.currentThread().interrupt();
								}
								break;
								
						}
					}
					
					
					break;
				
				case 3:
					
					
					boolean prof = true;
					
					while(prof){
					
						for(int i=0;i<50;i++){
							System.out.println("");
						}
						System.out.println("\n\n:: MENU DO PROFESSOR ::\n");
						System.out.println("1 - Cadastrar Atividades");
						System.out.println("2 - Lançar Notas");
						System.out.println("3 - Alterar Notas");
						System.out.println("4 - Lançar Faltas");
						System.out.println("5 - Listar Alunos de uma Turma");
						System.out.println("6 - Consultar Número de Disciplinas já lecionadas");
						System.out.println("7 - Fechar turma");
						System.out.println("8 - Voltar");
						
						leitura = entrada.nextLine();
						opcaoProfessor = Integer.parseInt(leitura);
						
						switch (opcaoProfessor) {
						
						
							case 1: 
								if((turmaImpl.getTurmas().size()!=0)){
									menuAtividade.cadastrar();
								}else{
									System.out.println("\nPara cadastrar uma atividade é necessário existir pelo menos uma turma!\n");
									try {
									    Thread.sleep(3000);
									} catch(InterruptedException ex) {
									    Thread.currentThread().interrupt();
									}
								}
								break;
							case 2:
								if(atividadeImpl.getListaDeAtividades().size()!=0){
									menuTurma.lancarNota();
								}else{
									System.out.println("É necessário existir pelo menos uma atividade para lançar notas!\n");
									try {
									    Thread.sleep(3000);
									} catch(InterruptedException ex) {
									    Thread.currentThread().interrupt();
									}
								}
								break;
							case 3:
								menuTurma.alterarNota();
								break;
							case 4:
								menuTurma.lancarFaltas();
								break;
							case 5:
								
								menuTurma.listarAlunos();
								
								break;
							case 6:
								
								menuProfessor.consultarDisciplinasLecionadas();
								
								for (Turma i: turmaImpl.getTurmas()){
									System.out.println("Turma: "+ i.getId()+ "\tDisciplina: "+ i.getNomeDisciplina()+"ID: "+i.getDisciplina().getId());
									
									for(Professor j: i.getProfessor()){
										System.out.println("\tNome: "+j.getNome()+"ID: "+j.getId());
									}
								
								}
								
								for (Atividade j: atividadeImpl.getListaDeAtividades()){
									System.out.println("\tNome: "+j.getNome()+"ID: "+j.getId());
								}
								
								break;
							case 7:
								menuTurma.definirStatus();
								
								break;
							case 8:
								prof = false;
								break;
							default:
								System.out.println("Opção inválida!\n");
								try {
								    Thread.sleep(3000);
								} catch(InterruptedException ex) {
								    Thread.currentThread().interrupt();
								}
								break;
						
						}
					}
						
								
					
					break;
					
				case 4:
					sair = true;
					
					for (Turma i : turmaImpl.getTurmas()) {
						turmaImpl.salvar(i,-1);	
					}
					
					for (Aluno i : alunoImpl.getListaDeAlunos()) {
						alunoImpl.salvar(i,historicoAtividadeImpl,-1);	
					}
					
					for (Atividade i : atividadeImpl.getListaDeAtividades()) {
						atividadeImpl.salvar(i,-1);	
					}
					
					for (Disciplina i : disciplinaImpl.getListaDeDisciplinas()) {
						
						disciplinaImpl.salvar(i,-1);	
					}
					
					for (Professor i : professorImpl.getListaDeProfessores()) {
						professorImpl.salvar(i,-1);	
					}
					
					for (Faltas i : faltasImpl.getListaDeFaltas()) {
						faltasImpl.salvar(i,-1);	
					}
					
					for (HistoricoAtividade i : historicoAtividadeImpl.getListaDeHistoricoAtividades()) {
						historicoAtividadeImpl.salvar(i,-1);	
					}
					
					for (HistoricoDisciplina i : historicoDisciplinaImpl.getHistoricoDisciplina()) {
						historicoDisciplinaImpl.salvar(i,-1);	
					}
					
					break;
				
				default:
					System.out.println("Opção inválida!\n");
					try {
					    Thread.sleep(3000);
					} catch(InterruptedException ex) {
					    Thread.currentThread().interrupt();
					}
					break;
			
			}
			
			
			
		}

	}

}